package com.xuxueli.commontdemo.commont.testSocket;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

	/**
	 * @param args
	 * @throws IOException
	 * @throws Exception
	 */
    /**
     * @param args
     * @throws IOException
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        Socket client = new Socket("127.0.0.1", 9966);
        // *************文件处理用
        DataInputStream filein = new DataInputStream(client.getInputStream());
        DataOutputStream fileout = new DataOutputStream(client
                .getOutputStream());
        // ******消息处理
        BufferedReader in = new BufferedReader(new InputStreamReader(client
                .getInputStream()));
        PrintWriter out = new PrintWriter(client.getOutputStream());

        System.out.println("请输入信息...");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {

            String str = br.readLine();

            //消息传输
            out.println(str);
            out.flush();

            /******************************
             * 请求要下载的文件
             * ****************************
             */

            if (str.equals("dir")) {
                // 读入一个已使用 UTF-8 修改版格式编码的字符串。
                String str2 = filein.readUTF();//读取服务器返回的信息:canLoad

                if ("canLoad".equals(str2)) {
                    // 返回所有的文件个数
                    int fileNum = filein.readInt();// //读取四个输入字节并返回一个 int 值。
                    System.out.println("服务器端下一共有 " + fileNum + " 文件");
                    System.out.println("请选择要下载的文件......");

                    for (int i = 1; i <= fileNum; i++) {
                        //输出文件
                        System.out.println(filein.readUTF());
                    }
                    System.out.println("请输入文件名:");
                    // 文件名
                    String fileName = null;
                    String fileName2 = null;
                    do {
                        // 接收从键盘输入的文件名
                        fileName2 = br.readLine();
                        fileName = fileName2.replace("get ", "");//去掉get

                    }
                    // 输入的文件名为空才跳出
                    while (fileName == null);
                    // 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
                    fileout.writeUTF(fileName);//把文件名传给服务器
                    //读取服务器返回的信息：start
                    str = filein.readUTF();

                    /*****************************
                     * 传输文件
                     * ***************************
                     */
                    if ("startDownLoad".equals(str)) {
                        System.out.println("*****文件开始传输*****");
                        //服务器端返回一个文件的长度
                        long length = filein.readLong();
                        //缓冲的输出流(把从服务器端下载下来的文件存放到指定地址)
                        BufferedOutputStream bos = new BufferedOutputStream(
                                new FileOutputStream("d:/ClientFiles/" + fileName));//别忘了创建文件夹（ClientFiles）


                        for (int j = 0; j < length; j++) {
                            //从文件输入流里读取文件
                            int files = filein.read();
                            //把文件安流的形式写入指定地址
                            bos.write(files);

                        }
                        System.out.println();
                        //关闭
                        bos.flush();
                        bos.close();
                        System.out.println("文件传输结束!!");

                    } else {
                        System.out.println("输入文件不存在！！");
                    }

                }

            }

            if (str.equals("exit")) {
                System.out.println("服务器已经关闭......");
                break;
            }
            System.out.println(in.readLine());
        }
        client.close();
    }
}